package gov.pr.celepar.sentinela.admin.dao.postgre;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import gov.pr.celepar.framework.util.Data;
import gov.pr.celepar.sentinela.admin.dao.LogUsuarioGrupoDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.pojo.Grupo;
import gov.pr.celepar.sentinela.admin.pojo.LogUsuarioGrupo;
import gov.pr.celepar.sentinela.admin.pojo.Usuario;
import gov.pr.celepar.sentinela.util.JDBCLogger;

public class PSQLLogUsuarioGrupoDAO implements LogUsuarioGrupoDAO {

	private static Log logger = LogFactory.getLog(PSQLLogUsuarioGrupoDAO.class);

	protected PSQLLogUsuarioGrupoDAO() {

	}

	public Collection<LogUsuarioGrupo> listar(Long codUsuario, Long codGrupo,
			Long codAutor, Date dataInicial, Date dataFinal, Integer limite)
			throws Exception {
		Collection<LogUsuarioGrupo> c = new ArrayList<LogUsuarioGrupo>();
		PreparedStatement sql = null;
		DAOFactoryServer dao = DAOFactoryServer.getDAOFactory();
		Connection conn = dao.createConnection();
		try {
			StringBuffer query = new StringBuffer();
			query.append("SELECT ").append("lug.codlog,").append(
					"lug.codusuario,").append("lug.codgrupo,").append(
					"lug.autor,").append("lug.datahora,")
					.append("lug.acesso, ").append("g.nomegrupo, ").append(
							"u.nomeusuario, ").append("u.loginusuario, ")
					.append("a.nomeusuario as nomeautor, ").append(
							"a.loginusuario as loginautor ");

			query.append("FROM ").append("log_usuario_grupo lug,").append(
					"grupo g, ").append("usuario u, ").append("usuario a ");

			query.append("WHERE ")

			.append("lug.autor = a.codusuario and ").append(
					"lug.codgrupo = g.codgrupo and ").append(
					"lug.codusuario = u.codusuario ");

			if (codUsuario != null) {
				query.append(" and lug.codusuario = ? ");
			}
			if (codGrupo != null) {
				query.append(" and lug.codGrupo=? ");
			}
			if (codAutor != null) {
				query.append(" and lug.autor=? ");
			}
			if (dataInicial != null)
				query.append(" and lug.datahora>=? ");
			if (dataFinal != null)
				query.append(" and lug.datahora<=? ");

			query.append("ORDER BY lug.datahora desc ");

			if (limite > 0)
				query.append("LIMIT " + limite);

			sql = conn.prepareStatement(query.toString());
			int i = 1;
			if (codUsuario != null)
				sql.setLong(i++, codUsuario);
			if (codGrupo != null)
				sql.setLong(i++, codGrupo);
			if (codAutor != null)
				sql.setLong(i++, codAutor);
			if (dataInicial != null)
				sql.setTimestamp(i++, new Timestamp(dataInicial.getTime()));
			if (dataFinal != null)// adiciona um dia para considerar a data
				sql.setTimestamp(i++, new Timestamp(Data.addDias(1, dataFinal)
						.getTime()));

			ResultSet rs = sql.executeQuery();
			JDBCLogger.logSQL(sql);
			while (rs.next()) {
				LogUsuarioGrupo log = new LogUsuarioGrupo();
				log.setCodLog(rs.getLong("codlog"));
				log.setDataHora(rs.getTimestamp("datahora"));
				log.setAcesso(rs.getBoolean("acesso"));
				Usuario usuario = new Usuario();
				usuario.setCodUsuario(rs.getLong("codusuario"));
				usuario.setNome(rs.getString("nomeusuario"));
				usuario.setLogin(rs.getString("loginusuario"));
				log.setUsuario(usuario);
				Grupo grupo = new Grupo();
				grupo.setCodGrupo(rs.getLong("codgrupo"));
				grupo.setNome(rs.getString("nomegrupo"));
				log.setGrupo(grupo);
				Usuario autor = new Usuario();
				autor.setCodUsuario(rs.getLong("autor"));
				autor.setNome(rs.getString("nomeautor"));
				autor.setLogin(rs.getString("loginautor"));
				log.setAutor(autor);
				c.add(log);
			}
			return c;
		} catch (Exception e) {
			logger.error("", e);
			throw e;
		} finally {
			if (sql != null)
				sql.close();
			dao.closeConnection(conn);
		}
	}

}
